目录
前言
一、Bety Buddy是什么?
1.Bety Buddy 定义
2.代码生成的其他的库类
3.代码生产代理库类性能指标
二、使用步骤
1.引入库
2.核心代码示例
总结
前言
在研发生产或运维中经常会有系统性能监控或链路追踪的需求,接下来我就详细给大家演示一个基于Byte Buddy库类的探针开发过程
一、Bety Buddy是什么?
1.Bety Buddy 定义
Byte Buddy 是基于ASM的一种通过领域特定语言(DSL)和注解的针对 Java 虚拟机的字节码编辑库类。
2.代码生成的其他的库类
Java Proxy
Java 类库自带了一个代理工具,它允许为实现了一系列接口的类创建代理。这个内置的代理供应商非常方便,但局限性也特别明显。 上面提到的安全框架就不能用这样的方式来实现的,因为我们想扩展是类而不是扩展接口。
cglib
代码生成库(注:这里指 cglib
)诞生于 Java 初期,但不幸的是没有跟上 Java 平台的发展。然而,cglib 仍然是一个相当强大的库,但其积极的开发却变得相当模糊。鉴于此,其许多用户已经离开了 cglib。
Javassist
该库附带一个编译器,它使用包含 Java 源代码的字符串,这些字符串在应用程序的运行时被转换为 Java 字节码。这是非常有前途的,本质上是一个好主意,因为 Java 源代码显然是描述 Java 类的好方法。但是,Javassist 编译器在功能上比不了 javac 编译器,并且在动态组合字符串以实现比较复杂的逻辑时容易出错。此外,Javassist 还提供了一个类似于 Java 类库中的代理工具,但允许扩展类,并不限于接口。然而,Javassist 的代理工具的范围在其 API 和功能上仍然受到限制。
即使评估完这些框架,但我们相信 Byte Buddy 提供了功能和便利,可以减少徒劳地搜索。Byte Buddy 提供了一种具有表现力的领域特定语言,允许通过编写简单的 Java 代码和使用强大的类型为你自己的代码创建非常自定义的运行时类。与此同时,Byte Buddy 还具有非常开放的定制性,并不限制开箱即用的功能。如果需要,你甚至可以为任何实现的方法定义自定义字节码。但即使不知道什么字节代码是或它如何工作,你可以做很多,而不深入到框架。
3.代码生产代理库类性能指标
二、使用步骤
1.引入库
引入Bety Buddy库类依赖:
net.bytebuddybyte-buddy1.10.19net.bytebuddybyte-buddy-agent1.10.19
2.核心代码示例
代码如下:
public static void main(String[] args) throws IllegalAccessException, InstantiationException {// 这里是自己创建的注解类AnnotationDescription classAnnotation = AnnotationDescription.Builder.ofType(RuntimeDefinition.class).build();AnnotationDescription someAnnotation = AnnotationDescription.Builder.ofType(RuntimeDefinition.class).build();Object obj = new ByteBuddy().subclass(Object.class).annotateType(classAnnotation).method(ElementMatchers.named("toString")).intercept(FixedValue.value("Hello World!")).annotateMethod(someAnnotation).make().load(Main.class.getClassLoader()).getLoaded().newInstance();String toString = obj.toString();System.out.println(toString);Annotation[] classAnnotations = obj.getClass().getAnnotations();for(Annotation annotation : classAnnotations){System.out.println("类上面的注解 " +annotation.annotationType());}System.out.println(obj.getClass().getCanonicalName());Method[] methods = obj.getClass().getMethods();for(Method method : methods){Annotation[] annotations = method.getDeclaredAnnotations();for(Annotation annotation : annotations){System.out.println(method.getName() + " 方法上面的注解 " +annotation.annotationType());}}}
该处使用的url网络请求的数据。
Hello World!
类上面的注解 interface com.xxx.xxx.agent.RuntimeDefinition
net.bytebuddy.renamed.java.lang.Object$ByteBuddy$orfS0hyn
toString 方法上面的注解 interface com.xxx.xxx.agent.RuntimeDefinition
总结
以上就是今天要讲的内容,本文仅仅简单介绍了Bety Buddy的简单使用方法,而Bety Buddy提供了大量能使我们快速生产字节码的方法,如果你好奇那就去分析SkyWalking的源码吧。